package com.stefanini.pe.bbva.bp.in.controller;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.stefanini.pe.bbva.bp.in.bo.iface.ParametrosBOIface;
import com.stefanini.pe.bbva.bp.in.bo.iface.ProductosClientesBOIface;
import com.stefanini.pe.bbva.bp.in.bo.iface.UsuarioBOIface;
import com.stefanini.pe.bbva.bp.in.model.ComboModel;
import com.stefanini.pe.bbva.bp.in.model.ConsultaProductosClientesModel;
import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.CategoriaProducto;
import com.stefanini.pe.bbva.bp.in.to.ProductoCliente;
import com.stefanini.pe.bbva.bp.in.to.UsuarioAsesor;
import com.stefanini.pe.bbva.bp.in.utils.ConstantesWeb;
import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Controller("consultaProductosClientesController")
@RequestScoped
public class ConsultaProductosClientesController extends GenericoController{

	private static Logger logger = Logger.getLogger(ConsultaProductosClientesController.class);
	
	@Autowired
	private ProductosClientesBOIface productosClientesBO;
	@Autowired
	private ParametrosBOIface parametrosBO;
	@Autowired
	private UsuarioBOIface usuarioBO;
	@Autowired
	private ConsultaProductosClientesModel consultaProductosClientesModel;
	
	public void onPageLoad(ComponentSystemEvent event){
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionUserAndContextValide() && !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("ConsultaProductosClientesController... is not Postback");
				
				this.consultaProductosClientesModel.setListaConsultaGeneral(new ArrayList<ProductoCliente>());
				this.consultaProductosClientesModel.setListaConsultaReporte(new ArrayList<ProductoCliente>());
				this.consultaProductosClientesModel.setListaSubTipoProducto(new ArrayList());
				this.consultaProductosClientesModel.getListaSubTipoProducto().add(new SelectItem("","TODOS"));
				this.consultaProductosClientesModel.setTipoProducto("");
				this.consultaProductosClientesModel.setSubTipoProducto("");
				this.consultaProductosClientesModel.setCodigoAsesor("");
				
				ComboModel comboModel = (ComboModel)SpringApplicationContext.getBean("comboModel");
				List<SelectItem> listTipoProd = comboModel.getListaCbxCategoriaProductos();
				if(listTipoProd != null && listTipoProd.size()>0){
					SelectItem iTipoProd = listTipoProd.get(0);
					consultaProductosClientesModel.setTipoProducto(Util.getStringF(iTipoProd.getValue()));
				}
				List<SelectItem> listAsesores = comboModel.getListaAsesores();
				if(listAsesores!=null && listAsesores.size()>0){
					SelectItem iAsesor = listAsesores.get(0);
					consultaProductosClientesModel.setCodigoAsesor(Util.getStringF(iAsesor.getValue()));
				}
				this.consultaProductosClientesModel.setNomAsesor("Todos");
				this.consultaProductosClientesModel.setNomProducto("Todos");
				
				getSessionMap().put(ConstantesWeb.Reportes.PARAM_NOMBRE_REPORTE,ConstantesWeb.Reportes.REPORTE_CONSULTA_PRODUCTO_CLIENTES);
				
				buscarCliente();
			}
		} catch (Exception e) {
			logger.error(e.getMessage(),e);
			e.printStackTrace();
		}
	}	
	
	public void buscarCliente(){
		try{
			List<ProductoCliente> listProductosClientes = productosClientesBO.buscarProductosClientes(consultaProductosClientesModel.getTipoProducto(), 
																									  consultaProductosClientesModel.getSubTipoProducto(), 
																									  consultaProductosClientesModel.getCodigoAsesor());
			for (ProductoCliente objProdCLiente : listProductosClientes) {
				objProdCLiente.setCodcontrato(Util.formatContrato(Util.isString(objProdCLiente.getCodcontrato()).trim()));
				objProdCLiente.setSaldoactualorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldoactualorigen())));
				objProdCLiente.setSaldodisponibleorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldodisponibleorigen())));
				objProdCLiente.setSaldoretenidoorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldoretenidoorigen())));
			}
	
			consultaProductosClientesModel.setListaConsultaGeneral(listProductosClientes);
			
			if(listProductosClientes.size()>0){
				this.buscarProductosTotalizados();
			}
	
			if (consultaProductosClientesModel.getCodigoAsesor().equalsIgnoreCase("0")){
				this.consultaProductosClientesModel.setNomAsesor("Todos");	
			}else{
				List<UsuarioAsesor> lista = usuarioBO.obtenerDatosUsuario_PorID(Integer.parseInt(consultaProductosClientesModel.getCodigoAsesor()));
				UsuarioAsesor oUsuarioAsesor = lista.get(0);
				this.consultaProductosClientesModel.setNomAsesor(oUsuarioAsesor.getApellidoPaterno() + " " +  oUsuarioAsesor.getApellidoMaterno() +  " " + oUsuarioAsesor.getNombre());
			}
	
			if (consultaProductosClientesModel.getTipoProducto().equalsIgnoreCase("0")){
				this.consultaProductosClientesModel.setNomProducto("Todos");	
			}else{
				List<CategoriaProducto> lista= parametrosBO.listarCategoriasProducto_PorID(Integer.parseInt(consultaProductosClientesModel.getTipoProducto()));
				CategoriaProducto oCategoriaProducto = lista.get(0);  
				this.consultaProductosClientesModel.setNomProducto(oCategoriaProducto.getDescripcion());
			}
	
			if (consultaProductosClientesModel.getSubTipoProducto().equalsIgnoreCase("")){
				this.consultaProductosClientesModel.setNomSubProducto("Todos");
			}else{
				this.consultaProductosClientesModel.setNomSubProducto(consultaProductosClientesModel.getSubTipoProducto().trim());
			}
		}catch(Exception e){
			e.printStackTrace();
			mostrarError("Error interno:",e.getMessage());
		}	
	}
	
	private void buscarProductosTotalizados() throws Exception{
		List<ProductoCliente> listProductosClientes = productosClientesBO.buscarProductosClientesTotales(consultaProductosClientesModel.getTipoProducto(), 
																										 consultaProductosClientesModel.getSubTipoProducto(), 
																										 consultaProductosClientesModel.getCodigoAsesor());
		for (ProductoCliente objProdCLiente : listProductosClientes) {
			objProdCLiente.setSaldoactualorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldoactualorigen())));
			objProdCLiente.setSaldodisponibleorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldodisponibleorigen())));
			objProdCLiente.setSaldoretenidoorigen(Util.formatDouble(Util.isNumber(objProdCLiente.getSaldoretenidoorigen())));
		}
		consultaProductosClientesModel.setListaConsultaReporteTotalizado(listProductosClientes);
	}
	
	public void changeProducto(){
		try{
			System.out.println("change Productos");
			String value = consultaProductosClientesModel.getTipoProducto();
			System.out.println("Value");
			List l = productosClientesBO.obtenerSubTipoProducto(value);
			this.getConsultaProductosClientesModel().setListaSubTipoProducto(new ArrayList<SelectItem>());
			this.getConsultaProductosClientesModel().getListaSubTipoProducto().add(new SelectItem("","-- Todos --"));
			for (Iterator iter = l.iterator(); iter.hasNext();) {
				Map element = (Map) iter.next();
				this.getConsultaProductosClientesModel().getListaSubTipoProducto().add(
							new SelectItem(Util.isString(element.get("descripcionproducto")),Util.isString(element.get("descripcionproducto"))));
				
			}
		}catch(Exception ex){
			ex.printStackTrace();
			mostrarError("Error interno:" + ex.getMessage());
		}	
	}
	
	public ConsultaProductosClientesModel getConsultaProductosClientesModel() {
		return consultaProductosClientesModel;
	}
}
